package ViewsTUI;

import Controllers.*;
import Models.*;
import byggemarked.Console;
import byggemarked.Tools;
import java.util.ArrayList;
import java.util.Date;

/**
 * @author Erik & Thomas
 */
public class SaleView
{
	private SaleCTR controller;

	public SaleView()
	{
		this.controller = new SaleCTR();
		ArrayList<String> options = new ArrayList<String>();
		options.add("Opret salg");
		options.add("Find salg");
		options.add("Hent salg");
		options.add("Slet salg");

		boolean isTimeToQuit = false;
		while(!isTimeToQuit)
		{
			Console.printMenu(true, "Salg", options);
			int choice = Console.readChoice(0, 5);
			switch(choice)
			{
				case 1: addSale();		break;
				case 2: findSale();		break;
				case 3: getSale();		break;
				case 4: removeSale();	break;
				case 0: isTimeToQuit = true;
			}
		}
	}

	private void addSale()
	{
		EmployeeCTR employees = new EmployeeCTR();
		Console.print("Indtast ID på den ønskede ansat:");
		Employee employee = null;
		boolean hasValidValue = false;
		while(!hasValidValue)
		{
			int employeeInt = Console.readInt();
			employee = employees.getEmployee(employeeInt);
			if(employee != null)
			{
				hasValidValue = true;
			}
			else
			{
				Console.print("Der findes ingen ansatte med det valgte ID. Prøv igen.");
			}
		}

		CustomerCTR customers = new CustomerCTR();
		Console.print("Indtast ID på den ønskede kunde:");
		Customer customer = null;
		hasValidValue = false;
		while(!hasValidValue)
		{
			int customerInt = Console.readInt();
			customer = customers.getCustomer(customerInt);
			if(customer != null)
			{
				hasValidValue = true;
			}
			else
			{
				Console.print("Der findes ingen kunder med det valgte ID. Prøv igen.");
			}
		}
		Sale sale = this.controller.addSale(customer, employee);
		this.addItems(sale);
		sale.pay();
	}

	private void findSale(boolean standAlone)
	{
		Console.print("Indtast den samlede pris:");
		double total = Console.readDouble(true);

		Console.print("Indtast salgsdato (DD-MM-YYYY):");
		Date date = Console.readDate(true);

		CustomerCTR customers = new CustomerCTR();
		Console.print("Indtast ID på den ønskede kunde:");
		Customer customer = null;
		boolean hasValidValue = false;
		while(!hasValidValue)
		{
			int customerInt = Console.readInt(true);
			if(customerInt != 99)
			{
				customer = customers.getCustomer(customerInt);
				if(customer != null)
				{
					hasValidValue = true;
				}
				else
				{
					Console.print("Der findes ingen kunde med det valgte ID. Prøv igen.");
				}
			}
			else
			{
				customer = null;
				hasValidValue = true;
			}
		}

		ItemCTR items = new ItemCTR();
		Console.print("Indtast ID på den ønskede vare:");
		Item item = null;
		hasValidValue = false;
		while(!hasValidValue)
		{
			int itemInt = Console.readInt(true);
			if(itemInt != 99)
			{
				item = items.getItem(itemInt);
				if(item != null)
				{
					hasValidValue = true;
				}
				else
				{
					Console.print("Der findes ingen varer med det valgte ID. Prøv igen.");
				}
			}
			else
			{
				item = null;
				hasValidValue = true;
			}
		}

		EmployeeCTR employees = new EmployeeCTR();
		Console.print("Indtast ID på den ønskede ansat:");
		Employee employee = null;
		hasValidValue = false;
		while(!hasValidValue)
		{
			int employeeInt = Console.readInt(true);
			if(employeeInt != 99)
			{
				employee = employees.getEmployee(employeeInt);
				if(employee != null)
				{
					hasValidValue = true;
				}
				else
				{
					Console.print("Der findes ingen ansatte med det valgte ID. Prøv igen.");
				}
			}
			else
			{
				employee = null;
				hasValidValue = true;
			}
		}

		Console.print("Indtast om salget skal leveres - 1 for Ja, 2 for Nej:");
        int deliveryInt = Console.readInt(true);
        boolean delivery;
        if(deliveryInt == 1)
        {
            delivery = true;
        }
        else
        {
            delivery = false;
        }

		Console.print("Indtast om salget er blevet leveret - 1 for Ja, 2 for Nej:");
        int deliveredInt = Console.readInt(true);
        boolean delivered;
        if(deliveredInt == 1)
        {
            delivered = true;
        }
        else
        {
            delivered = false;
        }

		Console.print("Indtast om salget er blevet betalt - 1 for Ja, 2 for Nej:");
        int paidInt = Console.readInt(true);
        boolean paid;
        if(paidInt == 1)
        {
            paid = true;
        }
        else
        {
            paid = false;
        }

        ArrayList<Sale> sales = this.controller.findSale(total, total, date, date, customer, employee, delivery, delivered, paid);
        if(sales.size() > 0)
		{
			this.showList(sales);
			if(standAlone)
			{
				Console.print("Indtast den ønskede salgs ID, som står ude til venstre i listen.");
				int id = Console.readInt();
				Sale sale = this.controller.getSale(id);
				if(sale != null)
				{
					this.showInfo(sale);
				}
				else
				{
					Console.print("Der kunne ikke findes nogen salg med det valgte ID.");
				}
			}
		}
		else
		{
			Console.print("Der fandtes ingen salg med de indtastede søgekriterier.");
		}
	}

	private void findSale()
	{
		this.findSale(true);
	}

	private void getSale()
	{
		Console.print("Indtast salgets ID.");
		int saleInt = Console.readInt();
		Sale sale = this.controller.getSale(saleInt);
		if(sale != null)
		{
			showInfo(sale);
		}
		else
		{
			Console.print("Der kunne ikke findes noget salg med det valgte ID.");
		}
	}

	private void removeSale()
	{
		Console.print("For at slette et salg, skal den først findes.");
		Sale sale = null;
		boolean hasValidSale = false;
		while(!hasValidSale)
		{
			try
			{
				sale = searchProcedure();
				if(sale != null)
				{
					hasValidSale = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
		}
		this.controller.removeSale(sale);
		Console.print("Salget med ID: "+sale.getId()+" er nu slettet fra salgsdatabasen.");
	}

	private Sale searchProcedure() throws Exception
	{
		Console.print("Hvordan vil du finde salget?");
		ArrayList<String> options = new ArrayList<String>();
		options.add("ID");
		options.add("Søgning");
		options.add("Liste");
		Console.printMenu(false, null, options);

		int choice = Console.readChoice(0, 3);
		int id = 0;
		boolean doSomething = true;
		switch(choice)
		{
			case 1:
				Console.print("Indtast salgets ID.");
				id = Console.readInt();
				break;
			case 2:
				Console.print("Indtast det ønskede salgs ID, som står ude til venstre i listen af søgeresultater.");
				this.findSale(false);
				id = Console.readInt();
				break;
			case 3:
				Console.print("Indtast det ønskede salgs ID, som står ude til venstre i listen.");
				this.showList(this.controller.getAllSales());
				id = Console.readInt();
				break;
			case 0:
				doSomething = false;
				break;

		}
		if(doSomething)
		{
			Sale sale = this.controller.getSale(id);
			if(sale != null)
			{
				return sale;
			}
			else
			{
				Console.print("Der kunne ikke findes noget salg med det valgte ID.");
				throw new Exception();
			}
		}
		else
		{
			return null;
		}
	}

	private int showList(ArrayList<Sale> sales)
	{
		int i = 0;
        for (Sale sale : sales)
        {
			i++;
			String customerName;
			if(sale.getCustomer() instanceof PrivateCustomer)
			{
				PrivateCustomer pCustomer = (PrivateCustomer)sale.getCustomer();
				customerName = pCustomer.getName();
			}
			else
			{
				BusinessCustomer bCustomer = (BusinessCustomer)sale.getCustomer();
				customerName = bCustomer.getCompanyName();
			}
			Console.print("{"+sale.getId()+"} "+Tools.makeNiceStringFromDate(sale.getDate())+"\t"+customerName);
        }
		return i;
	}

	private void showInfo(Sale sale)
	{
		String customerName;
		if(sale.getCustomer() instanceof PrivateCustomer)
		{
			PrivateCustomer pCustomer = (PrivateCustomer)sale.getCustomer();
			customerName = pCustomer.getName();
		}
		else
		{
			BusinessCustomer bCustomer = (BusinessCustomer)sale.getCustomer();
			customerName = bCustomer.getCompanyName();
		}
		String levering = (sale.isDelivery() == true)?"Ja":"Nej";
		String leveret = (sale.isDelivered() == true)?"Ja":"Nej";
		String betalt = (sale.isPaid() == true)?"Ja":"Nej";
		Console.print("-Salg-");
		Console.print("Total: "+sale.getTotal()+"\tDato: "+Tools.makeNiceStringFromDate(sale.getDate()));
		Console.print("Kunde: "+customerName);
		Console.print("Varer:");
		Console.printList(sale.getItems());
		Console.print("Ansat: "+sale.getEmployee().getName());
		Console.print("Levering: "+levering);
		Console.print("Leveret: "+leveret);
		Console.print("Betalt: "+betalt);
	}

	private void addItems(Sale sale)
	{
		ItemCTR stock = new ItemCTR();
		Console.print("Indtast ID på de ønskede varer eller skan stregkoden:");
        boolean wantToAddMore = true;
        while(wantToAddMore)
        {
            int itemInt = Console.readInt();
            if(itemInt != 0)
            {
                Item item = stock.getItem(itemInt);
				if (item != null)
				{
					sale.addItem(item);
				}
				else
				{
					Console.print("Der findes ingen vare med det valgte ID. Prøv igen.");
				}
            }
            else
            {
                wantToAddMore = false;
            }
        }
	}
}
